{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Effective Dimension of Qiskit Neural Networks\n",
    "In this tutorial, we will take advantage of the `EffectiveDimension` and `LocalEffectiveDimension` classes to evaluate the power of Quantum Neural Network models. These are metrics based on information geometry that connect to notions such as trainability, expressibility or ability to generalize.\n",
    "\n",
    "Before diving into the code example, we will briefly explain what is the difference between these two metrics, and why are they relevant to the study of Quantum Neural Networks. More information about global effective dimension can be found in [this paper](https://arxiv.org/pdf/2011.00027.pdf), while the local effective dimension was introduced in a [later work](https://arxiv.org/abs/2112.04807)."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "pycharm": {
     "name": "#%% md\n"
    }
   },
   "source": [
    "## 1. Global vs. Local Effective Dimension\n",
    "Both classical and quantum machine learning models share a common goal: being good at **generalizing**, i.e. learning insights from data and applying them on unseen data.\n",
    "\n",
    "Finding a good metric to assess this ability is a non-trivial matter. In [The Power of Quantum Neural Networks](https://arxiv.org/pdf/2011.00027.pdf), the authors introduce the **global** effective dimension as a useful indicator of how well a particular model will be able to perform on new data. In [Effective Dimension of Machine Learning Models](https://arxiv.org/pdf/2112.04807.pdf), the **local** effective dimension is proposed as a new capacity measure that bounds the generalization error of machine learning models.\n",
    "\n",
    "The key difference between global (`EffectiveDimension` class) and **local** effective dimension (`LocalEffectiveDimension` class) is actually not in the way they are computed, but in the nature of the parameter space that is analyzed. The global effective dimension incorporates the **full parameter space** of the model, and is calculated from a **large number of parameter (weight) sets**. On the other hand, the local effective dimension focuses on how well the **trained** model can generalize to new data, and how **expressive** it can be. Therefore, the local effective dimension is calculated from **a single** set of weight samples (training result). This difference is small in terms of practical implementation, but quite relevant at a conceptual level."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 2. The Effective Dimension Algorithm\n",
    "\n",
    "Both the global and local effective dimension algorithms use the Fisher Information matrix to provide a measure of complexity. The details on how this matrix is calculated are provided in the [reference paper](https://arxiv.org/pdf/2011.00027.pdf), but in general terms, this matrix captures how sensitive a neural network's output is to changes in the network's parameter space.\n",
    "\n",
    "In particular, this algorithm follows 4 main steps:\n",
    "\n",
    "1. **Monte Carlo simulation:** the forward and backward passes (gradients) of the neural network are computed for each pair of input and weight samples.\n",
    "2. **Fisher Matrix Computation:** these outputs and gradients are used to compute the Fisher Information Matrix.\n",
    "3. **Fisher Matrix Normalization:** averaging over all input samples and dividing by the matrix trace\n",
    "4. **Effective Dimension Calculation:** according to the formula from [*Abbas et al.*](https://arxiv.org/pdf/2011.00027.pdf)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "slide"
    }
   },
   "source": [
    "## 3. Basic Example (SamplerQNN)\n",
    "\n",
    "This example shows how to set up a QNN model problem and run the global effective dimension algorithm. Both Qiskit `SamplerQNN` (shown in this example) and `EstimatorQNN` (shown in a later example) can be used with the `EffectiveDimension` class.\n",
    "\n",
    "We start off from the required imports and a fixed seed for the random number generator for reproducibility purposes."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {
    "slideshow": {
     "slide_type": "skip"
    }
   },
   "outputs": [],
   "source": [
    "# Necessary imports\n",
    "import matplotlib.pyplot as plt\n",
    "import numpy as np\n",
    "from IPython.display import clear_output\n",
    "from qiskit import QuantumCircuit\n",
    "from qiskit.circuit.library import z_feature_map, real_amplitudes\n",
    "from qiskit_machine_learning.optimizers import COBYLA\n",
    "from qiskit_machine_learning.utils import algorithm_globals\n",
    "from qiskit.primitives import StatevectorSampler as Sampler, StatevectorEstimator as Estimator\n",
    "\n",
    "from sklearn.datasets import make_classification\n",
    "from sklearn.preprocessing import MinMaxScaler\n",
    "\n",
    "from qiskit_machine_learning.circuit.library import qnn_circuit\n",
    "from qiskit_machine_learning.algorithms.classifiers import NeuralNetworkClassifier\n",
    "from qiskit_machine_learning.neural_networks import EffectiveDimension, LocalEffectiveDimension\n",
    "from qiskit_machine_learning.neural_networks import SamplerQNN, EstimatorQNN\n",
    "\n",
    "# set random seed\n",
    "algorithm_globals.random_seed = 42\n",
    "sampler = Sampler()\n",
    "estimator = Estimator()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "pycharm": {
     "name": "#%% md\n"
    },
    "slideshow": {
     "slide_type": "skip"
    }
   },
   "source": [
    "### 3.1 Define QNN\n",
    "\n",
    "The first step to create a `SamplerQNN` is to define a parametrized feature map and ansatz. In this toy example, we will use 3 qubits and the `QNNCircuit` class to simplify the composition of a feature map and an ansatz circuit. The resulting circuit is then used in the `SamplerQNN` class."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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",
      "text/plain": [
       "<Figure size 621.941x284.278 with 1 Axes>"
      ]
     },
     "execution_count": 2,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "num_qubits = 3\n",
    "# combine a custom feature map and ansatz into a single circuit\n",
    "qc, fm_params, anz_params = qnn_circuit(\n",
    "    feature_map=z_feature_map(feature_dimension=num_qubits, reps=1),\n",
    "    ansatz=real_amplitudes(num_qubits, reps=1),\n",
    ")\n",
    "qc.draw(output=\"mpl\", style=\"clifford\")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "The parametrized circuit can then be sent together with an optional interpret map (parity in this case) to the `SamplerQNN` constructor."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {
    "pycharm": {
     "name": "#%%\n"
    }
   },
   "outputs": [],
   "source": [
    "# parity maps bitstrings to 0 or 1\n",
    "def parity(x):\n",
    "    return \"{:b}\".format(x).count(\"1\") % 2\n",
    "\n",
    "\n",
    "output_shape = 2  # corresponds to the number of classes, possible outcomes of the (parity) mapping."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {
    "pycharm": {
     "name": "#%%\n"
    }
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "No gradient function provided, creating a gradient function. If your Sampler requires transpilation, please provide a pass manager.\n"
     ]
    }
   ],
   "source": [
    "# construct QNN\n",
    "qnn = SamplerQNN(\n",
    "    circuit=qc,\n",
    "    input_params=fm_params,\n",
    "    weight_params=anz_params,\n",
    "    interpret=parity,\n",
    "    output_shape=output_shape,\n",
    "    sparse=False,\n",
    "    sampler=sampler,\n",
    ")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 3.2 Set up Effective Dimension calculation\n",
    "\n",
    "In order to compute the effective dimension of our QNN using the `EffectiveDimension` class, we need a series of sets of input samples and weights, as well as the total number of data samples available in a dataset. The `input_samples` and `weight_samples` are set in the class constructor, while the number of data samples is given during the call to the effective dimension computation, to be able to test and compare how this measure changes with different dataset sizes."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "We can define the number of input samples and weight samples and the class will randomly sample a corresponding array from a normal (for `input_samples`) or a uniform (for `weight_samples`) distribution. Instead of passing a number of samples we can pass an array, sampled manually."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {
    "pycharm": {
     "name": "#%%\n"
    }
   },
   "outputs": [],
   "source": [
    "# we can set the total number of input samples and weight samples for random selection\n",
    "num_input_samples = 10\n",
    "num_weight_samples = 10\n",
    "\n",
    "global_ed = EffectiveDimension(\n",
    "    qnn=qnn, weight_samples=num_weight_samples, input_samples=num_input_samples\n",
    ")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "If we want to test a specific set of input samples and weight samples, we can provide it directly to the `EffectiveDimension` class as shown in the following snippet:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {
    "pycharm": {
     "name": "#%%\n"
    }
   },
   "outputs": [],
   "source": [
    "# we can also provide user-defined samples and parameters\n",
    "input_samples = algorithm_globals.random.normal(0, 1, size=(10, qnn.num_inputs))\n",
    "weight_samples = algorithm_globals.random.uniform(0, 1, size=(10, qnn.num_weights))\n",
    "\n",
    "global_ed = EffectiveDimension(qnn=qnn, weight_samples=weight_samples, input_samples=input_samples)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "The effective dimension algorithm also requires a dataset size. In this example, we will define an array of sizes to later see how this input affects the result."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {
    "pycharm": {
     "name": "#%%\n"
    }
   },
   "outputs": [],
   "source": [
    "# finally, we will define ranges to test different numbers of data, n\n",
    "n = [5000, 8000, 10000, 40000, 60000, 100000, 150000, 200000, 500000, 1000000]"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 3.3 Compute Global Effective Dimension\n",
    "Let's now calculate the effective dimension of our network for the previously defined set of input samples, weights, and a dataset size of 5000."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {
    "pycharm": {
     "name": "#%%\n"
    }
   },
   "outputs": [],
   "source": [
    "global_eff_dim_0 = global_ed.get_effective_dimension(dataset_size=n[0])"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "The effective dimension values will range between 0 and `d`, where `d` represents the dimension of the model, and it's practically obtained from the number of weights of the QNN. By dividing the result by `d`, we can obtain the normalized effective dimension, which correlates directly with the capacity of the model."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {
    "pycharm": {
     "name": "#%%\n"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Data size: 5000, global effective dimension: 4.6869\n",
      "Number of weights: 6, normalized effective dimension: 0.7811\n"
     ]
    }
   ],
   "source": [
    "d = qnn.num_weights\n",
    "\n",
    "print(\"Data size: {}, global effective dimension: {:.4f}\".format(n[0], global_eff_dim_0))\n",
    "print(\n",
    "    \"Number of weights: {}, normalized effective dimension: {:.4f}\".format(d, global_eff_dim_0 / d)\n",
    ")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "By calling the `EffectiveDimension` class with an array if input sizes `n`, we can monitor how the effective dimension changes with the dataset size."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {
    "pycharm": {
     "name": "#%%\n"
    },
    "slideshow": {
     "slide_type": "-"
    }
   },
   "outputs": [],
   "source": [
    "global_eff_dim_1 = global_ed.get_effective_dimension(dataset_size=n)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {
    "pycharm": {
     "name": "#%%\n"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Effective dimension: [4.70898969 4.75912172 4.78446878 4.94794558 4.99410001 5.04949871\n",
      " 5.09092283 5.11885466 5.19968721 5.25303014]\n",
      "Number of weights: 6\n"
     ]
    }
   ],
   "source": [
    "print(\"Effective dimension: {}\".format(global_eff_dim_1))\n",
    "print(\"Number of weights: {}\".format(d))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {
    "pycharm": {
     "name": "#%%\n"
    },
    "slideshow": {
     "slide_type": "slide"
    }
   },
   "outputs": [
    {
     "data": {
      "image/png": "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",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# plot the normalized effective dimension for the model\n",
    "plt.plot(n, np.array(global_eff_dim_1) / d)\n",
    "plt.xlabel(\"Number of data\")\n",
    "plt.ylabel(\"Normalized GLOBAL effective dimension\")\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "pycharm": {
     "name": "#%% md\n"
    }
   },
   "source": [
    "## 4. Local Effective Dimension Example\n",
    "As explained in the introduction, the local effective dimension algorithm only uses **one** set of weights, and it can be used to monitor how training affects the expressiveness of a neural network. The `LocalEffectiveDimension` class enforces this constraint to ensure that these calculations are conceptually separate, but the rest of the implementation is shared with `EffectiveDimension`.\n",
    "\n",
    "This example shows how to leverage the `LocalEffectiveDimension` class to analyze the effect of training on QNN expressiveness."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 4.1 Define Dataset and QNN\n",
    "\n",
    "We start by creating a 3D binary classification dataset using `make_classification` function from scikit-learn."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {
    "pycharm": {
     "name": "#%%\n"
    }
   },
   "outputs": [],
   "source": [
    "num_inputs = 3\n",
    "num_samples = 50\n",
    "\n",
    "X, y = make_classification(\n",
    "    n_samples=num_samples,\n",
    "    n_features=num_inputs,\n",
    "    n_informative=3,\n",
    "    n_redundant=0,\n",
    "    n_clusters_per_class=1,\n",
    "    class_sep=2.0,\n",
    ")\n",
    "X = MinMaxScaler().fit_transform(X)\n",
    "y = 2 * y - 1  # labels in {-1, 1}"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "The next step is to create a QNN, an instance of `EstimatorQNN` in our case in the same fashion we created an instance of `SamplerQNN`."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {
    "pycharm": {
     "name": "#%%\n"
    }
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "No gradient function provided, creating a gradient function. If your Estimator requires transpilation, please provide a pass manager.\n"
     ]
    }
   ],
   "source": [
    "estimator_qnn = EstimatorQNN(\n",
    "    circuit=qc, input_params=fm_params, weight_params=anz_params, estimator=estimator\n",
    ")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 4.2 Train QNN\n",
    "\n",
    "We can now proceed to train the QNN. The training step may take some time, be patient. You can pass a callback to the classifier to observe how the training process is going on. We fix `initial_point` for reproducibility purposes as usual."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {
    "pycharm": {
     "name": "#%%\n"
    }
   },
   "outputs": [],
   "source": [
    "# callback function that draws a live plot when the .fit() method is called\n",
    "def callback_graph(weights, obj_func_eval):\n",
    "    clear_output(wait=True)\n",
    "    objective_func_vals.append(obj_func_eval)\n",
    "    plt.title(\"Objective function value against iteration\")\n",
    "    plt.xlabel(\"Iteration\")\n",
    "    plt.ylabel(\"Objective function value\")\n",
    "    plt.plot(range(len(objective_func_vals)), objective_func_vals)\n",
    "    plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {
    "pycharm": {
     "name": "#%%\n"
    }
   },
   "outputs": [],
   "source": [
    "# construct classifier\n",
    "initial_point = algorithm_globals.random.random(estimator_qnn.num_weights)\n",
    "\n",
    "estimator_classifier = NeuralNetworkClassifier(\n",
    "    neural_network=estimator_qnn,\n",
    "    optimizer=COBYLA(maxiter=80),\n",
    "    initial_point=initial_point,\n",
    "    callback=callback_graph,\n",
    ")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {
    "pycharm": {
     "name": "#%%\n"
    }
   },
   "outputs": [
    {
     "data": {
      "image/png": "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8sgjEh0dLaeeeqqMGTNGwsLCvN86tFjac24JDTY96Vo8jpAOAAAAAEfm0hjk5557TvLz881pDelZWVmu3A2tHBXeAQAAAMALPendu3eXWbNmyemnn27moC9dulTatGlT521POukkN5uAQK7wfqiglArvAAAAAODJkP7EE0/IddddJzNnzjRF484999w6b6fXVVRUuPrcCHDRVHgHAAAAAM+HdC0Wpwcd8h4XFyebNm2S9u3bu/dMaMVrpbPjBgAAAAA8Xt09JiZGFi5cKD169JDQULcLw6OVOTwnvczXTQEAAACAFsHtpH3yySd7pyUI4JBOTzoAAAAAeKy6O9CUtdLzmZMOAAAAAC4hpMNrYu1z0ksJ6QAAAADgCkI6vCaa6u4AAAAA0DwhfevWrTJ//nwpKioy53X9dKDu6u6EdAAAAADwSkg/dOiQjBs3Tvr27SsTJ06U9PR0c/mf//xnuf322919OASwGEuIOc4qLPV1UwAAAAAgMEP6rbfeapZfS01NlaioKMflF110kcybN8/T7UMLNqBTnDlesvWgbMnI83VzAAAAACDwQvrXX38t//jHP6RLly7VLu/Tp4/s2rXLk21DCze0S4KcPrCDVFpFZny5wdfNAQAAAIDAC+kFBQXVetDtMjMzxWKxeKpdCBD3ThwgocFBsnDTAflxywFfNwcAAAAAAiukn3jiifLmm286zgcFBUllZaU8/vjjcuqpp3q6fWjherSLliljupvTj36xQSq0Wx0AAAAAUCdb+W03aBgfO3asrFy5UkpLS+Wuu+6SdevWmZ70JUuWuPtwaAVuHttbPvllt2zclycfrUyTi0d39XWTAAAAACAwetIHDx4smzdvlhNOOEH++Mc/muHv5513nqxevVp69erlnVaiRUuICpebx/Yxp//59WbJZ0k2AAAAAKhTkLWVLXCem5sr8fHxkpOTI3Fxturj8L7S8ko5/ekfZOehQvm/03rL7af383WTAAAAAMDvcqjbPem9e/eWhx56SLZs2dKUNqKVCQ8NlnsmDDCnX1q0XfZmF/m6SQAAAADgd9wO6TfeeKN88cUX0q9fPzn66KPl2WeflX379nmndQgo4wd1kNE9EqWkvFL+OX+Tr5sDAAAAAC0/pN96662yYsUK2bhxo0ycOFGef/55SUlJkdNPP71a1XegJl0J4G9n2nrTP129R37b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9Wnb4D07duyQffv2Vdvu8fHxZqoD271ly8nJMceJiYnmWL/f2rvuvK11OGXXrl3Z1i1YRUWFvP/++2bEhA57ZzsHHh0hc+aZZ1bbpoptHVh0SLNOS+vZs6dMnjxZUlNTzeVs58Dx3//+V0aNGmV6U3Va2ogRI+Tll192XM9vssDNWG+//bZcddVVZsi7v3+nCel+5uDBg+bHXocOHapdruf1DwYCk33bst0DS2VlpZm3qsPqBg8ebC7T7RkeHi4JCQnVbsu2bpl+//13M4/NYrHIddddJ5999pkMHDiQ7RxgdAeMTj/TmhM1sa0Dh4aw2bNny7x580zNCQ1rJ554ouTl5bGdA8j27dvN9u3Tp4/Mnz9frr/+ern55pvljTfeMNfzmywwzZkzR7Kzs+WKK64w5/39Ox3q6wYAQCD3vK1du7banEYEln79+smaNWvMiImPP/5Ypk6daua1IXCkpaXJtGnTzFxGLeaKwDVhwgTHaa07oKG9W7du8uGHH5riYQicHejakz5jxgxzXnvS9d9qnX+uf8MRmF599VXzHdeRMi0BPel+pl27dhISElKrsqCe79ixo8/aBe+yb1u2e+C46aab5H//+58sXLjQFBiz0+2pQ650b64ztnXLpHvhe/fuLSNHjjS9rFoc8tlnn2U7BxAdEqmFW4866igJDQ01B90Ro0Wl9LT2urCtA5P2sPXt21e2bt3KdzqAaMV2HfHkbMCAAY6pDfwmCzy7du2Sb7/9Vq6++mrHZf7+nSak++EPPv2xt2DBgmp7/PS8znNEYOrRo4f5g+C83XNzc01FUbZ7y6J1ATWg67Dn7777zmxbZ/r91oqyzttal2jTHwds65ZP/16XlJSwnQPI2LFjzbQGHTFhP2gvnM5Xtp9mWwem/Px82bZtmwl1fKcDh05Bq7k06ubNm82oCcVvssDz+uuvm/oDWlfEzu+/076uXIfa3n//fVNBcvbs2db169dbr732WmtCQoJ13759vm4amlgZePXq1eagX72nnnrKnN61a5e5/rHHHjPbee7cudbffvvN+sc//tHao0cPa1FRka+bDjdcf/311vj4eOv3339vTU9PdxwKCwsdt7nuuuusXbt2tX733XfWlStXWseMGWMOaFnuueceU7V/x44d5jur54OCgqxff/21uZ7tHLicq7srtnVguP32283fbv1OL1myxDpu3Dhru3btzCodiu0cGH7++WdraGio9dFHH7Vu2bLF+s4771ijoqKsb7/9tuM2/CYLHBUVFeZ7q1X9a/Ln7zQh3U8999xz5kMTHh5ulmRbtmyZr5uEJlq4cKEJ5zUPU6dONdfrchD333+/tUOHDmYnzdixY62bNm3ydbPhprq2sR5ef/11x230H/kbbrjBLNelPwzOPfdcE+TRslx11VXWbt26mb/TSUlJ5jtrD+iK7dx6QjrbOjBcdNFF1k6dOpnvdOfOnc35rVu3Oq5nOweOzz//3Dp48GDze6t///7Wl156qdr1/CYLHPPnzze/w+rafv78nQ7S//i6Nx8AAAAAADAnHQAAAAAAv0FIBwAAAADATxDSAQAAAADwE4R0AAAAAAD8BCEdAAAAAAA/QUgHAAAAAMBPENIBAAAAAPAThHQAAAAAAPwEIR0AAHhU9+7d5ZlnnvF1MwAAaJEI6QAAtGBXXHGFnHPOOeb0KaecIrfcckuzPffs2bMlISGh1uUrVqyQa6+9ttnaAQBAIAn1dQMAAIB/KS0tlfDw8EbfPykpyaPtAQCgNaEnHQCAAOlR/+GHH+TZZ5+VoKAgc9i5c6e5bu3atTJhwgSJiYmRDh06yOWXXy4HDx503Fd74G+66SbTC9+uXTsZP368ufypp56SIUOGSHR0tKSkpMgNN9wg+fn55rrvv/9errzySsnJyXE830MPPVTncPfU1FT54x//aJ4/Li5OLrzwQsnIyHBcr/cbPny4vPXWW+a+8fHxcvHFF0teXl6zvX8AAPgLQjoAAAFAw/mYMWPkmmuukfT0dHPQYJ2dnS2nnXaajBgxQlauXCnz5s0zAVmDsrM33njD9J4vWbJEXnzxRXNZcHCwzJo1S9atW2eu/+677+Suu+4y1x133HEmiGvotj/fHXfcUatdlZWVJqBnZmaanQjffPONbN++XS666KJqt9u2bZvMmTNH/ve//5mD3vaxxx7z6nsGAIA/Yrg7AAABQHufNWRHRUVJx44dHZf/61//MgF9xowZjstee+01E+A3b94sffv2NZf16dNHHn/88WqP6Ty/XXu4//73v8t1110nL7zwgnkufU7tQXd+vpoWLFggv//+u+zYscM8p3rzzTdl0KBBZu760Ucf7QjzOsc9NjbWnNfefr3vo48+6rH3CACAloCedAAAAtivv/4qCxcuNEPN7Yf+/fs7eq/tRo4cWeu+3377rYwdO1Y6d+5swrMG50OHDklhYaHLz79hwwYTzu0BXQ0cONAUnNPrnHcC2AO66tSpk+zfv79RrxkAgJaMnnQAAAKYziGfNGmS/OMf/6h1nQZhO5137kzns5911lly/fXXm97sxMREWbx4sfz5z382heW0x96TwsLCqp3XHnrtXQcAoLUhpAMAECB0CHpFRUW1y4466ij55JNPTE91aKjr/+yvWrXKhOQnn3zSzE1XH3744RGfr6YBAwZIWlqaOdh709evX2/mymuPOgAAqI7h7gAABAgN4suXLze94Fq9XUP2jTfeaIq2XXLJJWYOuA5xnz9/vqnM3lDA7t27t5SVlclzzz1nCr1p5XV7QTnn59Oeep07rs9X1zD4cePGmQrxkydPll9++UV+/vlnmTJlipx88skyatQor7wPAAC0ZIR0AAAChFZXDwkJMT3Uula5Ln2WnJxsKrZrID/99NNNYNaCcDon3N5DXpdhw4aZJdh0mPzgwYPlnXfekZkzZ1a7jVZ410JyWqldn69m4Tn7sPW5c+dKmzZt5KSTTjKhvWfPnvLBBx945T0AAKClC7JarVZfNwIAAAAAANCTDgAAAACA3yCkAwAAAADgJwjpAAAAAAD4CUI6AAAAAAB+gpAOAAAAAICfIKQDAAAAAOAnCOkAAAAAAPgJQjoAAAAAAH6CkA4AAAAAgJ8gpAMAAAAA4CcI6QAAAAAAiH/4f1mYOvMvqcjVAAAAAElFTkSuQmCC",
      "text/plain": [
       "<Figure size 1200x600 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# create empty array for callback to store evaluations of the objective function (callback)\n",
    "objective_func_vals = []\n",
    "plt.rcParams[\"figure.figsize\"] = (12, 6)\n",
    "\n",
    "# fit classifier to data\n",
    "estimator_classifier.fit(X, y)\n",
    "\n",
    "# return to default figsize\n",
    "plt.rcParams[\"figure.figsize\"] = (6, 4)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "The classifier can now differentiate between classes with an accuracy of:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.92"
      ]
     },
     "execution_count": 18,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# score classifier\n",
    "estimator_classifier.score(X, y)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 4.3 Compute Local Effective Dimension of trained QNN\n",
    "\n",
    "Now that we have trained our network, let's evaluate the local effective dimension based on the trained weights. To do that we access the trained weights directly from the classifier."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "metadata": {
    "pycharm": {
     "name": "#%%\n"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "normalized local effective dimensions for trained QNN:  [0.58736561 0.60356709 0.61139953 0.66021793 0.67409459 0.69100973\n",
      " 0.70386078 0.71262122 0.73834454 0.75555202]\n"
     ]
    }
   ],
   "source": [
    "trained_weights = estimator_classifier.weights\n",
    "\n",
    "# get Local Effective Dimension for set of trained weights\n",
    "local_ed_trained = LocalEffectiveDimension(\n",
    "    qnn=estimator_qnn, weight_samples=trained_weights, input_samples=X\n",
    ")\n",
    "\n",
    "local_eff_dim_trained = local_ed_trained.get_effective_dimension(dataset_size=n)\n",
    "\n",
    "print(\n",
    "    \"normalized local effective dimensions for trained QNN: \",\n",
    "    local_eff_dim_trained / estimator_qnn.num_weights,\n",
    ")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 4.4 Compute Local Effective Dimension of untrained QNN\n",
    "\n",
    "We can compare this result with the effective dimension of the untrained network, using the `initial_point` as our weight sample:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "normalized local effective dimensions for untrained QNN:  [0.71561399 0.72479494 0.72914099 0.75604525 0.76401973 0.77415475\n",
      " 0.78220576 0.78787406 0.80530318 0.8175029 ]\n"
     ]
    }
   ],
   "source": [
    "# get Local Effective Dimension for set of untrained weights\n",
    "local_ed_untrained = LocalEffectiveDimension(\n",
    "    qnn=estimator_qnn, weight_samples=initial_point, input_samples=X\n",
    ")\n",
    "\n",
    "local_eff_dim_untrained = local_ed_untrained.get_effective_dimension(dataset_size=n)\n",
    "\n",
    "print(\n",
    "    \"normalized local effective dimensions for untrained QNN: \",\n",
    "    local_eff_dim_untrained / estimator_qnn.num_weights,\n",
    ")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "pycharm": {
     "name": "#%% md\n"
    }
   },
   "source": [
    "### 4.5 Plot and analyze results\n",
    "\n",
    "If we plot the effective dimension values before and after training, we can see the following result:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "metadata": {
    "pycharm": {
     "name": "#%%\n"
    },
    "tags": [
     "nbsphinx-thumbnail"
    ]
   },
   "outputs": [
    {
     "data": {
      "image/png": "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3LM+OBNiBd60SpUqOfSY+J/LfzSOxffU8fieOh7fU8fje1r839O8ZkA0TEwlIiIiXTAIISIiIl0wCClkvr6+MmbMGPWVHIPvqePxPXU8vqeOx/fU9d5TJqYSERGRLjgTQkRERLpgEEJERES6YBBCREREumAQQkRERLpgEOIA06ZNk6pVq4qfn5+0bNlStmzZkuvzlyxZIrVr11bPb9Cggfzyyy9FNlZXfE9nzZol7du3l1KlSqlLp06d8vx/4I7s/T3VLFq0SFUO7tGjR6GP0dXf0xs3bsgLL7wgFSpUULsRatWqxX//BXxPp06dKlFRUeLv768qf77yyiuSlJRUZOMtzv766y956KGHVOVS/Bv+8ccf8/ye9evXS9OmTdXvZ82aNWXevHmFO0jsjqH8W7RokcHHx8cwZ84cw/79+w2DBw82hIaGGi5dumT1+f/884/B09PTMHnyZMOBAwcM77zzjsHb29uwd+/eIh+7q7ynvXv3NkybNs2wc+dOw8GDBw3PPPOMISQkxHDu3LkiH3txZe97qjl58qShYsWKhvbt2xsefvjhIhuvK76nycnJhubNmxu6detm2Lhxo3pv169fb9i1a1eRj91V3tMFCxYYfH191Ve8n7/99puhQoUKhldeeaXIx14c/fLLL4a3337bsGzZMuyCNSxfvjzX5584ccIQEBBgGDFihDo/ff755+p8tXr16kIbI4OQAmrRooXhhRdeyLqdnp5uiIiIMEycONHq83v27Gl44IEHzO5r2bKl4dlnny30sbrqe2opLS3NEBQUZJg/f34hjtL131O8j23atDHMnj3b0K9fPwYhBXxPp0+fbqhevbohJSWlCEfp2u8pntuxY0ez+3ACbdu2baGP1dmIDUHIyJEjDfXq1TO774knnjB06dKl0MbF5ZgCSElJke3bt6vpf9O+M7i9adMmq9+D+02fD126dMnx+e4mP++ppcTERElNTZWwsLBCHKnrv6fjxo2TsmXLysCBA4topK79nq5YsUJat26tlmPKlSsn9evXlwkTJkh6enoRjty13tM2bdqo79GWbE6cOKGWt7p161Zk43Ylm3Q4P7GBXQFcuXJF/QHBHxRTuH3o0CGr3xMdHW31+bif8veeWnrjjTfUGqjlPyZ3lZ/3dOPGjfL111/Lrl27imiUrv+e4gS5du1a6dOnjzpRHjt2TJ5/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",
      "text/plain": [
       "<Figure size 600x400 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# plot the normalized effective dimension for the model\n",
    "plt.plot(n, np.array(local_eff_dim_trained) / estimator_qnn.num_weights, label=\"trained weights\")\n",
    "plt.plot(\n",
    "    n, np.array(local_eff_dim_untrained) / estimator_qnn.num_weights, label=\"untrained weights\"\n",
    ")\n",
    "\n",
    "plt.xlabel(\"Number of data\")\n",
    "plt.ylabel(\"Normalized LOCAL effective dimension\")\n",
    "plt.legend()\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "In general, we should expect the value of the local effective dimension to decrease after training. This can be understood by looking back into the main goal of machine learning, which is to pick a model that is expressive enough to fit your data, but not too expressive that it overfits and performs badly on new data samples.  \n",
    "\n",
    "Certain optimizers help regularize the overfitting of a model by learning parameters, and this action of learning inherently reduces a model’s expressiveness, as measured by the local effective dimension. Following this logic, a randomly initialized parameter set will most likely produce a higher effective dimension that the final set of trained weights, because that model with that particular parameterization is “using more parameters” unnecessarily to fit the data. After training (with the implicit regularization), a trained model will not need to use so many parameters and thus have more “inactive parameters” and a lower effective dimension. \n",
    "\n",
    "We must keep in mind though that this is the general intuition, and there might be cases where a randomly selected set of weights happens to provide a lower effective dimension than the trained weights for a specific model. "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "metadata": {
    "pycharm": {
     "name": "#%%\n"
    }
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<h3>Version Information</h3><table><tr><th>Software</th><th>Version</th></tr><tr><td><code>qiskit</code></td><td>1.4.3</td></tr><tr><td><code>qiskit_machine_learning</code></td><td>0.9.0</td></tr><tr><th colspan='2'>System information</th></tr><tr><td>Python version</td><td>3.12.9</td></tr><tr><td>OS</td><td>Windows</td></tr><tr><td colspan='2'>Fri Jul 18 15:48:17 2025 Eastern Daylight Time</td></tr></table>"
      ],
      "text/plain": [
       "<IPython.core.display.HTML object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       "<div style='width: 100%; background-color:#d5d9e0;padding-left: 10px; padding-bottom: 10px; padding-right: 10px; padding-top: 5px'><h3>This code is a part of a Qiskit project</h3><p>&copy; Copyright IBM 2017, 2025.</p><p>This code is licensed under the Apache License, Version 2.0. You may<br>obtain a copy of this license in the LICENSE.txt file in the root directory<br> of this source tree or at http://www.apache.org/licenses/LICENSE-2.0.<p>Any modifications or derivative works of this code must retain this<br>copyright notice, and modified files need to carry a notice indicating<br>that they have been altered from the originals.</p></div>"
      ],
      "text/plain": [
       "<IPython.core.display.HTML object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "import tutorial_magics\n",
    "\n",
    "%qiskit_version_table\n",
    "%qiskit_copyright"
   ]
  }
 ],
 "metadata": {
  "celltoolbar": "Tags",
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.12.9"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 4
}
